package com.sun.proxy;

import com.sun.inter.Calculator;
import com.sun.utils.LogUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class CalculatorProxy {
    /**
     * 为传入的参数对象创建一个代理
     */
    public static Calculator getProxy(final Calculator calculator) {

        //方法执行器
        InvocationHandler h = new InvocationHandler() {
            /**
             *
             * @param proxy 代理对象，给jdk使用，任何时候都不要动
             * @param method 当前目标对象的将要执行的方法
             * @param args 方法调用时外界传入的值
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("动态代理即将执行的方法");
                Object result = null;

                try {
                   LogUtils.logStart(method,args);
                    //反射方法执行目标方法，将返回值传出
                    result = method.invoke(calculator, args);
                    LogUtils.logReturn(method,result);
                } catch (Exception e) {
                    LogUtils.logException(method,e);
                }finally {
                    LogUtils.logEnd(method);
                }

                return result;
            }
        };

        Class<?>[] interfaces = calculator.getClass().getInterfaces();
        ClassLoader loader = calculator.getClass().getClassLoader();

        Calculator proxy = (Calculator) Proxy.newProxyInstance(loader, interfaces, h);
        return proxy;
    }
}
